type RandomCodeOption = {
  mode?: string;
  length?: number;
  chunkSize?: number;
  separator?: string;
  exclude?: string; // 例如 oO0iIjJlL1
  prefix?: string;
  suffix?: string;
};

/**
 * 生成随机码
 * @param {object} option 参数对象
 * @property {number} option.length 码长度 默认6
 * @property {string} option.mode 码类型 num全数字（默认） | abc全字母 | all字母数字混合
 * @property {number} option.chunkSize 分组长度 可选
 * @property {string} option.separator 分组分隔符 可选
 * @property {string} option.exclude 字符排除项 可选
 * @property {string} option.prefix 自定义前缀 可选
 * @property {string} option.suffix 自定义后缀 可选
 * @return {string} 生成的码
 */
export function generateRandomCode(option?: RandomCodeOption): string {
  const opt = Object.assign(
    {
      length: 6,
      mode: 'num'
    },
    option
  );

  let characters = '';
  if (opt.mode === 'num') {
    characters = '0123456789';
  } else if (opt.mode === 'abc') {
    characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  } else {
    characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  }

  // 排除部分字符
  if (opt.exclude) {
    characters = characters.replace(new RegExp(`[${opt.exclude}]`, 'g'), '');
  }

  let result = '';
  let formattedResult = '';

  // 生成随机字符串
  for (let i = 0; i < opt.length; i++) {
    result += characters.charAt(Math.floor(Math.random() * characters.length));
  }

  // 如果chunkSize或separator未定义，则不进行分组
  if (opt.chunkSize && opt.separator) {
    // 按照指定的chunkSize进行分组并插入separator
    for (let i = 0; i < result.length; i++) {
      if (i > 0 && i % opt.chunkSize === 0) {
        formattedResult += opt.separator;
      }
      formattedResult += result[i];
    }
  } else {
    // 如果没有分组，直接使用原始的result
    formattedResult = result;
  }

  // 前后缀
  if (opt.prefix) {
    formattedResult = opt.prefix + formattedResult;
  }
  if (opt.suffix) {
    formattedResult = formattedResult + opt.suffix;
  }

  return formattedResult;
}
